package com.cwh.taskcenter.lock;

import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

/**
 * @author cwh
 */
public interface DistributedLock {

    /**
     * 尝试获取锁
     * @param waitTime 等待时间
     * @param leaseTime 持有时间
     * @param unit 时间单位
     * @return 是否获取成功
     */
    boolean tryLock(String lockKey,long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;

    /**
     * 释放锁
     */
    void unlock(String lockKey);

    /**
     * 在锁中执行代码（带返回值）
     * @param supplier 业务逻辑
     * @param waitTime 等待时间
     * @param leaseTime 持有时间
     * @param unit 时间单位
     * @return 业务逻辑执行结果
     */
    <T> T executeInLock(Supplier<T> supplier, long waitTime, long leaseTime, TimeUnit unit);

    /**
     * 在锁中执行代码（无返回值）
     * @param runnable 业务逻辑
     * @param waitTime 等待时间
     * @param leaseTime 持有时间
     * @param unit 时间单位
     */
    void executeInLock(Runnable runnable, long waitTime, long leaseTime, TimeUnit unit);
}